import { useUserStore } from '@/store/user';

/**
 * 操作权限处理，只需包含其中一个，权限标签值为数组
 * @param {Array} value 校验值
 */
export function hasPermi(value) {
  if (value && value instanceof Array && value.length > 0) {
    const userStore = useUserStore();
    const { permissionButtonMap } = userStore;
    const permissionCode = value;
    const hasPermissions = permissionCode.some((code) => permissionButtonMap.has(code));
    if (!hasPermissions) {
      return false;
    }
    return true;
  }
  console.error(`need roles! Like hasPermi="['system:user:add','system:user:edit']"`);
  return false;
}

/**
 * 操作权限处理，必须全部拥有，权限标签值为数组
 * @param value
 * @returns
 */
export function hasPermiAnd(value) {
  if (value && value instanceof Array && value.length > 0) {
    const userStore = useUserStore();
    const { permissionButtonMap } = userStore;
    const permissionCode = value;
    const hasPermissions = permissionCode.every((code) => permissionButtonMap.has(code));
    if (!hasPermissions) {
      return false;
    }
    return true;
  }
  console.error(`need roles! Like hasPermiAnd="['system:user:add','system:user:edit']"`);
  return false;
}

/**
 * 角色权限处理，只需包含其中一个，角色权限标签值为数组
 * @param value
 * @returns
 */
export function hasRole(value) {
  if (value && value instanceof Array && value.length > 0) {
    const userStore = useUserStore();
    const { roleMap } = userStore;
    const roles = value;
    const hasRole = roles.some((role) => roleMap.has(role));
    if (!hasRole) {
      return false;
    }
    return true;
  }
  console.error(`need roles! Like hasRole="['admin','system']"`);
  return false;
}

/**
 * 角色权限处理，必须全部拥有，角色权限标签值为数组
 * @param value
 * @returns
 */
export function hasRoleAnd(value) {
  if (value && value instanceof Array && value.length > 0) {
    const userStore = useUserStore();
    const { roleMap } = userStore;
    const roles = value;
    const hasRole = roles.every((role) => roleMap.has(role));
    if (!hasRole) {
      return false;
    }
    return true;
  }
  console.error(`need roles! Like hasRole="['admin','system']"`);
  return false;
}

/**
 * 表格列资源权限校验
 * 是否具有参数指定的资源标识集合中任意一项的权限
 * @param {Array} columnCodeList 资源标识集合
 * @returns {Boolean} true: 有权限; false: 无权限
 */
export function hasColumnPermi(columnCodeList: Array<string>) {
  if (columnCodeList && columnCodeList instanceof Array && columnCodeList.length > 0) {
    const userStore = useUserStore();
    const { denyPermissionColumnMap } = userStore;
    // 禁止的列权限为空, 则返回有权限
    if (denyPermissionColumnMap) {
      return true;
    }

    // 任意一项资源未被禁止即表示有权限
    const hasPermi = columnCodeList.some((code) => !denyPermissionColumnMap.has(code));
    if (hasPermi) {
      return true;
    }
    return false;
  }
  return true;
}

/**
 * 表格列资源权限校验
 * 是否具有参数指定的资源标识集合中所有项的权限
 * @param {Array} columnCodeList 资源标识集合
 * @returns {Boolean} true: 有权限; false: 无权限
 */
export function hasColumnPermiAnd(columnCodeList: Array<string>) {
  if (columnCodeList && columnCodeList instanceof Array && columnCodeList.length > 0) {
    const userStore = useUserStore();
    const { denyPermissionColumnMap } = userStore;
    const hasPermi = columnCodeList.every((code) => !denyPermissionColumnMap.has(code));
    if (hasPermi) {
      return true;
    }
    return false;
  }
  return true;
}

export interface FilterColumnsPermissionParam<T> {
  /** 数据列表，泛型 T 表示列表项的类型 */
  dataList: T[];

  /** 可选：格式化权限代码的函数 */
  formatPermissionCode?: (item: T) => string | null | undefined;

  /** 可选：资源标识对应字段名，必须是 T 的键之一 */
  permissionCodeField?: keyof T;
}

/**
 * 根据用户权限过滤数据列表
 *
 * 此函数用于根据用户的权限信息过滤给定的数据列表,它会检查数据列表中的每个项，
 * 并根据用户的权限列映射来决定是否将该项包含在结果列表中
 *
 * @param {FilterColumnsPermissionParam<T>} 参数对象 包含数据列表、资源标识格式化函数或资源标识字段
 * @returns {T[]} 过滤后的数据列表，仅包含用户有权限的项
 */
export function filterColumnsPermission<T>({ dataList, formatPermissionCode, permissionCodeField }: FilterColumnsPermissionParam<T>): T[] {
  // 如果数据列表为空或资源标识字段未提供，则返回空数组
  if (!dataList?.length || (!permissionCodeField && !formatPermissionCode)) {
    return [];
  }

  // 获取用户存储以访问权限信息
  const userStore = useUserStore();
  const { denyPermissionColumnMap } = userStore;

  // 未登录时列权限为空直接返回原数据集
  if (!denyPermissionColumnMap) {
    return dataList;
  }

  // 过滤数据列表，仅保留用户有权限的项
  const resultList = dataList.filter((element) => {
    // 获取元素的资源标识，如果未提供格式化函数，则直接使用权限代码字段的值
    const permissionCode = formatPermissionCode ? formatPermissionCode(element) : (element[permissionCodeField] as string);
    // 如果资源标识为空，则保留该项，否则根据权限列映射决定是否保留
    if (!permissionCode) return true;
    return !denyPermissionColumnMap.has(permissionCode);
  });

  // 返回过滤后的列表
  return resultList;
}
